public class MGraph {
    int vertexNum;
    int [][] adjMatrix;

    MGraph(int vertexNum) {
        this.vertexNum = vertexNum;
        adjMatrix = new int[vertexNum][vertexNum];
    }

    void addArc(int vi, int vj) {
        if(vi < 1 || vi > vertexNum)
            throw new RuntimeException("Not contain Vertex " + vi);
        if(vj < 1 || vj > vertexNum)
            throw new RuntimeException("Not contain Vertex " + vj);
        adjMatrix[vi-1][vj-1] = 1;
    }

    void print() {
        System.out.print("   ");
        for(int i = 1; i <= vertexNum; i++)
            System.out.print(String.format("%2d", i));
        System.out.println();

        int lable = 1;
        for(int[] a : adjMatrix) {
            System.out.print(lable++ + " [");
            for(int i : a)
                System.out.print(String.format("%2d", i));
            System.out.println(" ]");
        }
    }

    static MGraph createUndigraph() {
        MGraph mGraph = new MGraph(5);
        mGraph.addArc(1, 2);    mGraph.addArc(1, 3);    mGraph.addArc(1, 4);
        mGraph.addArc(2, 1);    mGraph.addArc(2, 4);
        mGraph.addArc(3, 1);
        mGraph.addArc(4, 1);    mGraph.addArc(4, 2);
        mGraph.addArc(5,2);  mGraph.addArc(5,3);
        return mGraph;
    } // sample for 8.10 undigraph adjancet graph.

    static MGraph createDigraph() {
        MGraph mGraph = new MGraph(5);
        mGraph.addArc(1, 2);
        mGraph.addArc(2, 4);
        mGraph.addArc(4, 2);    mGraph.addArc(4, 3);
        mGraph.addArc(5,1);     mGraph.addArc(5,4);
        return mGraph;
    } // sample for 8.11 undigraph adjancet graph.

    public static void main(String[] args) {
        MGraph.createUndigraph().print();
        MGraph.createDigraph().print();
    }

}
